package concursos.controladores;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;

import org.primefaces.context.RequestContext;
import org.primefaces.event.RowEditEvent;

import concursos.interfaces.ConcursoService;
import concursos.interfaces.LembreteService;
import concursos.modelos.Concurso;
import concursos.modelos.Conteudo;
import concursos.modelos.Lembrete;
import concursos.modelos.Usuario;

@ManagedBean
@SessionScoped
public class LembreteMB {

	@EJB
	private LembreteService beanLembrete;
	@ManagedProperty(value = "#{usuarioMB}")
	private UsuarioMB usuarioMB;
	private List<Lembrete> listaLembretes = new ArrayList<Lembrete>();
	private int idBusca, idExclusao;
	private Lembrete lembrete = new Lembrete();
	private Concurso concursoSelecionado;
	private Lembrete lembreteSelecionado;
	private int id;
	private int id_usuario;

	private List<Concurso> listaConcurso = new ArrayList<Concurso>();
	@EJB
	private ConcursoService beanConcurso;

	public LembreteMB() {
		Usuario usuario;
		Object user = (Usuario) FacesContext.getCurrentInstance()
				.getExternalContext().getSessionMap().get("usuario");

		usuario = (Usuario) user;
		this.id_usuario = usuario.getId();
	}

	public List<Concurso> getListaConcurso() {
		return new ArrayList<Concurso>(
				this.beanConcurso.listarConcursos(id_usuario));
	}

	public void setListaConcurso(List<Concurso> listaConcurso) {
		this.listaConcurso = listaConcurso;
	}

	public void cadastrarLembrete() throws Exception {
		FacesContext context = FacesContext.getCurrentInstance();
		Date data = new Date();
		SimpleDateFormat formatador = new SimpleDateFormat("dd/MM/yyyy");

		if (this.id != 0)
			this.lembrete.setConcurso(this.beanConcurso.buscaPorId(this.id));

		if (!(this.lembrete.getConcurso() == null)) {
			if (this.lembrete.isEnviarEmail()) {
				if (this.lembrete.getDataLembrar().before(data)
						|| formatador.format(data).equals(
								formatador.format(this.lembrete
										.getDataLembrar())))
					context.addMessage(null, new FacesMessage(
							FacesMessage.SEVERITY_ERROR, "Aviso",
							"Agenda para uma data posterior a atual"));
				else {
					if (this.id != 0)
						this.concursoSelecionado = this.beanConcurso
								.buscaPorId(this.id);

					this.lembrete.setConcurso(this.concursoSelecionado);
					this.beanLembrete.salvarLembrete(this.lembrete);

					context.addMessage(null, new FacesMessage("Sucesso",
							"Lembrete cadastrado com sucesso para o concurso "
									+ this.lembrete.getConcurso().getNome()));

					this.lembrete = new Lembrete();

				}

			} else {
				if (this.id != 0)
					this.concursoSelecionado = this.beanConcurso
							.buscaPorId(this.id);

				this.lembrete.setConcurso(this.concursoSelecionado);
				this.beanLembrete.salvarLembrete(this.lembrete);

				if (formatador.format(this.lembrete.getDataLembrar()).equals(
						formatador.format(data))) {
					this.usuarioMB.setQuantidadeLembretesAtual(this.usuarioMB
							.getQuantidadeLembretesAtual() + 1);

					FacesContext.getCurrentInstance().getExternalContext()
							.redirect("listarLembretes.xhtml");
				}

				context.addMessage(null, new FacesMessage("Sucesso",
						"Lembrete cadastrado com sucesso para o concurso "
								+ this.lembrete.getConcurso().getNome()));

				this.lembrete = new Lembrete();
			}
		} else
			context.addMessage(null, new FacesMessage(
					FacesMessage.SEVERITY_ERROR, "Aviso",
					"Nenhum concurso selecionado."));

	}

	public void excluirLembrete() {
		this.beanLembrete.excluirLembrete(this.lembreteSelecionado);

		FacesContext context = FacesContext.getCurrentInstance();
		context.addMessage(null, new FacesMessage("Sucesso",
				"Lembrete excluido com sucesso"));

		this.buscarLembretePorConcurso();
	}

	public void buscaPorId() {
		this.lembrete = this.beanLembrete.buscaPorId(idBusca);
	}

	public int getIdBusca() {
		return this.idBusca;
	}

	public void setIdBusca(int idBusca) {
		this.idBusca = idBusca;
	}

	public int getIdExclusao() {
		return this.idExclusao;
	}

	public void setIdExclusao(int idExclusao) {
		this.idExclusao = idExclusao;
	}

	public Concurso getConcursoSelecionado() {
		return concursoSelecionado;
	}

	public void setConcursoSelecionado(Concurso concursoSelecionado) {
		this.concursoSelecionado = concursoSelecionado;
	}

	public Lembrete getLembrete() {
		return this.lembrete;
	}

	public void setLembrete(Lembrete lembrete) {
		this.lembrete = lembrete;
	}

	public void buscarLembretePorConcurso() {
		if (this.id == 0) {
			this.listaLembretes = new ArrayList<Lembrete>();
		} else if (this.id == 1) {
			this.listaLembretes = this.beanLembrete
					.listarLembretes(this.id_usuario);
		} else
			this.listaLembretes = this.beanLembrete.buscarPorConcurso(this.id);

		try {
			FacesContext.getCurrentInstance().getExternalContext()
					.redirect("listarLembretes.xhtml");
		} catch (IOException exception) {
		}
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public List<Lembrete> getListaLembretes() {
		return this.listaLembretes;
	}

	public void setListaLembretes(List<Lembrete> listaLembretes) {
		this.listaLembretes = listaLembretes;
	}

	public void selecionarConcurso(Concurso concurso) {
		this.concursoSelecionado = new Concurso();
		setConcursoSelecionado(concurso);
	}

	public void selecionarLembrete(Lembrete lembrete) {
		this.lembreteSelecionado = new Lembrete();
		setLembreteSelecionado(lembrete);
	}

	public void resetDialog() {
		RequestContext.getCurrentInstance().reset("listarConcursos.xhtml");
	}

	public Lembrete getLembreteSelecionado() {
		return this.lembreteSelecionado;
	}

	public void setLembreteSelecionado(Lembrete lembreteSelecionado) {
		this.lembreteSelecionado = lembreteSelecionado;
	}

	public void onEdit(RowEditEvent event) {
		this.beanLembrete.salvarLembrete((Lembrete) event.getObject());
		FacesContext context = FacesContext.getCurrentInstance();
		context.addMessage(null, new FacesMessage("Sucesso",
				"Lembrete alterado com sucesso"));
	}

	public UsuarioMB getUsuarioMB() {
		return this.usuarioMB;
	}

	public void setUsuarioMB(UsuarioMB usuarioMB) {
		this.usuarioMB = usuarioMB;
	}

}
